'''
Author: duliang thinktanker@163.com
Date: 2024-04-22 15:50:03
LastEditors: duliang thinktanker@163.com
LastEditTime: 2024-05-11 23:27:46
Description: 实现文字转图片功能
'''
from PIL import Image, ImageDraw, ImageFont
import io
import time


def merge_images(images_list, output_path, direction=0):
    if direction == 0:
        # 定义一个足够大的空白画布来容纳所有图片
        width, height = sum(i.size[0]
                            for i in images_list), max(i.size[1]
                                                       for i in images_list)
        result_image = Image.new('RGB', (width, height),
                                 color=(255, 255, 255))  # 创建白色背景的空白图像
        x_offset = 0  # 初始水平偏移量
        for img in images_list:
            # 将每个图片粘贴到结果画布上相应的位置
            result_image.paste(img, (x_offset, 0))
            x_offset += img.size[0]  # 更新水平偏移量为当前图片宽度
    elif direction == 1:
        # 定义一个足够大的空白画布来容纳所有图片
        width, height = max(i.size[0]
                            for i in images_list), sum(i.size[1]
                                                       for i in images_list)
        result_image = Image.new('RGB', (width, height),
                                 color=(255, 255, 255))  # 创建白色背景的空白图像
        y_offset = 0  # 初始垂直偏移量
        for img in images_list:
            # 将每个图片粘贴到结果画布上相应的位置
            result_image.paste(img, (0, y_offset))
            y_offset += img.size[1]  # 更新垂直偏移量为当前图片高度

    # 保存合并后的图片
    result_image.save(output_path)
    imgbytes = io.BytesIO()
    result_image.save(imgbytes, format='PNG')
    return imgbytes.getvalue()


def create_empty_jpg(filename, size=(100, 100), color=(255, 255, 255)):
    """
    创建一个指定尺寸和背景色的空JPEG图像文件。

    参数:
        filename (str): 新建图像文件的路径及名称，包括扩展名（如 "empty_image.jpg"）。
        size (tuple, optional): 图像的宽度和高度，单位为像素。默认为 (100, 100)。
        color (tuple, optional): 图像背景色，由RGB三通道组成，每个值范围是0-255。默认为白色（255, 255, 255）。
    """
    # 创建一个空白图像
    img = Image.new('RGB', size, color)

    # 保存为JPEG格式
    img.save(filename, format='JPEG')


# # 使用示例
# create_empty_jpg('empty_image.jpg', size=(800, 600),
#                  color=(0, 0, 0))  # 创建一个800x600像素的黑色背景空JPEG文件


def get_text_list_size(text_list, font_path, font_size):
    """
    计算文本列表中所有文本的宽度和高度。

    参数:
        text_list (list): 包含要计算宽度和高度的文本的列表。
        font_path (str): 字体文件路径。
        font_size (int): 字体大小。

    返回:
        tuple: 包含文本宽度和高度的元组。
    """
    # 加载字体
    font = ImageFont.truetype(font_path, font_size)
    # 创建一个临时的ImageDraw对象来计算文本宽度
    draw = ImageDraw.Draw(Image.new('RGB', (1, 1)))  # 创建一个很小的空白图像，仅用于计算文本尺寸
    img_width = 0
    img_height = 0

    for text in text_list:
        # 获取文本的宽度和高度
        # text_width, text_height = draw.textsize(text, font=font)
        x, y, text_width, text_height = draw.textbbox((0, 0),
                                                      text=text,
                                                      font=font)
        # 更新图片宽度，最大宽度
        img_width = max(img_width, text_width)
        # 更新图片高度，累计所有文本高度
        img_height += text_height
    # print(img_width, img_height)
    return img_width + 20, img_height + 20


def add_text_to_image(
    output_path,
    text_list,
    #   width=100,
    #   height=300,
    x=10,
    y=10,
    font_path='arial.ttf',
    font_size=30,
    font_color=(255, 255, 255),
    background_color=(0, 0, 0)):
    """
    在图片上添加文字，并保存到指定路径。

    参数:
        image_path (str): 输入图片路径。
        output_path (str): 输出带文字图片的保存路径。
        text (str): 要添加的文字内容。
        position (tuple, optional): 文字在图片上的起始位置（x, y）。默认为图片左上角（0, 0）。
        font_path (str, optional): 字体文件路径。默认使用Arial字体。
        font_size (int, optional): 字体大小。默认为30。
        font_color (tuple, optional): 文字颜色（R, G, B）。默认为白色（255, 255, 255）。
    """
    width, height = get_text_list_size(text_list, font_path, font_size)
    # 创建一个空白图像
    img = Image.new('RGB', (width, height), color=background_color)
    # 打开图片
    # img = Image.open(image_path)

    # 加载字体
    font = ImageFont.truetype(font_path, font_size)

    # 创建绘图对象
    draw = ImageDraw.Draw(img)

    # 在图片上绘制文字
    for text in text_list:
        draw.text((x, y), text, fill=font_color, font=font)
        y += font_size  # 调整y坐标，以便下一行文字

    # 保存处理后的图片
    img.save(output_path)
    imgBytes = io.BytesIO()
    img.save(imgBytes, format='PNG')
    print(f"\033[33m添加文字，保存路径：{output_path}\033[0m")
    return imgBytes.getvalue()


def draw_table(data,
               cell_size=(100, 25),
               line_color=(255, 255, 255),
               text_color=(255, 255, 255),
               font_size=2):
    """
    绘制表格并将结果保存为图片

    参数:
        data (list[list[str]]): 表格数据，二维列表形式
        cell_size (tuple[int, int]): 单元格尺寸（宽度，高度）
        line_color (tuple[int, int, int]): 线条颜色（RGB）
        text_color (tuple[int, int, int]): 文本颜色（RGB）
        font_size (int): 字体与表格 高度的反比值，2表示表格高度的1/2

    返回:
        Image: 绘制好的表格Image对象
    """

    # 计算表格总尺寸
    num_rows, num_cols = len(data), len(data[0])
    table_width, table_height = num_cols * cell_size[0], num_rows * cell_size[1]

    # 创建黑色背景图像
    img = Image.new('RGB', (table_width, table_height), color=(0, 0, 0))
    draw = ImageDraw.Draw(img)

    # 绘制单元格线条
    for row in range(num_rows + 1):
        y = row * cell_size[1]
        draw.line([(0, y), (table_width, y)], fill=line_color)

    for col in range(num_cols + 1):
        x = col * cell_size[0]
        draw.line([(x, 0), (x, table_height)], fill=line_color, width=2)

    # 添加文字
    font = ImageFont.truetype("./font/yahei.ttf",
                              size=cell_size[1] // font_size)  # 调整字体大小以适应单元格
    table_title = False
    for row in range(num_rows):
        for col in range(num_cols):
            text = data[row][col]
            # print(f'data[{row}][{col}]', text)
            x, y = col * cell_size[0] + cell_size[0] // 10, row * cell_size[
                1] + cell_size[1] // 4
            if table_title:
                x -= cell_size[0] // 2
            if text:
                draw.text((x, y), str(text), fill=text_color, font=font)
                text_color = (255, 255, 255)
                table_title = False
            else:
                # (left, top, right, bottom)
                draw.rectangle([
                    col * cell_size[0], row * cell_size[1],
                    (col + 1) * cell_size[0] * 2, (row + 1) * cell_size[1]
                ],
                               fill=line_color)
                text_color = (0, 0, 0)
                table_title = True
                # draw.text((x, y), "名称：", fill=text_color, font=font)

    return img


def getgqpic(text_list, image_name, cell_size=(100, 25)):
    """
    绘制表格并将结果保存为图片

    参数:
        text_list (list[list[str]]): 表格数据，二维列表形式
        image_name (str): 保存的图片名称
        cell_size (tuple[int, int]):  单元格尺寸（宽度，高度）

    返回:
        bytes: 绘制好的表格bytes对象
    """
    data = []
    for text in text_list:
        # t = t.replace('\n', '')
        if not '&' in text:
            data.append(text.split(':'))
        else:
            data.append(list(reversed(text.split('&'))))
    # print(data)
    # cell_row_size, cell_coloumn_size = get_text_list_size(
    #     text_list, './font/yahei.ttf', 12)
    # 单元格尺寸（例如，每个单元格宽高均为50像素）
    # cell_size = (cell_coloumn_size * 3, cell_row_size)
    # cell_size = (200, 60)
    # print(cell_size)

    # 绘制表格
    table_img = draw_table(data, cell_size)

    # 保存为PNG图片
    image_path = f"./image/{image_name}.png"
    table_img.save(image_path)
    print(f"\033[33m实时报表，保存路径：{image_path}\033[0m")
    imgBytes = io.BytesIO()
    table_img.save(imgBytes, format='PNG')
    return imgBytes.getvalue()


def getnydhbpic(text_list, image_name, cell_size=(100, 25), angle=0):
    """
    绘制表格并将结果保存为图片

    参数:
        text_list (list[list[str]]): 表格数据，二维列表形式
        image_name (str): 保存的图片名称
    """
    nengyuandanhao_image = draw_table(data=text_list,
                                      font_size=2,
                                      cell_size=cell_size)
    nengyuandanhao_image = nengyuandanhao_image.rotate(angle=angle,
                                                       expand=True,
                                                       fillcolor=(255, 255,
                                                                  255))
    nengyuandanhao_image.save(f'./image/{image_name}.png')
    imgBytes = io.BytesIO()
    nengyuandanhao_image.save(imgBytes, format='PNG')
    return imgBytes.getvalue()


if __name__ == '__main__':
    # temp = [
    #     '24年04月22日:22时40分05秒\n', '上游:18.68', '栅前:15.76', '栅后:15.75', '扬程:2.92',
    #     '廊道:0.76', '主变温度1:39.6 ℃', '主变温度2:39.1 ℃', '运行台数:0.0', '总流量:0.0\n',
    #     '站变高压侧&', 'Ia:0.8', 'Ic:0.7', 'Uab:37.3', 'Ubc:37.3', 'Uca:37.3',
    #     'P:38.5', 'Q:21.0', 'cosφ:0.88\n', '站变低压侧&', 'Ia:3.0', 'Ic:3.0',
    #     'Uab:6.1', 'Ubc:6.1', 'Uca:6.1', 'P:27.0', 'Q:7.2', 'cosφ:1.0\n'
    # ]
    # getgqpic(temp, 'test')
    # image1 = Image.open('./image/2znydhb.png')
    # image2 = Image.open('./image/2zsq.png')
    # merge_images([image2, image1], 'merged_image.png')
    # 使用示例
    t = add_text_to_image(
        output_path='./image/output_image_with_text.jpg',
        text_list=[
            '刘老涧抽水站', '正在运行', '1# 2# 3#',
            time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
        ],
        # x=20,
        # y=20,
        font_path='./font/Yahei.TTF',  # 替换为实际字体文件路径
        font_size=16,
        # font_color=(255, 255, 255)  # 白色文字
    )
